#include "lvgl/lvgl.h"
#include "../ui.h"
#include <string.h>
#include <stdio.h>  
#include <unistd.h>

// 外部资源声明
extern const lv_img_dsc_t back1;  // 背景图
extern const lv_img_dsc_t NEIKE;
extern const lv_img_dsc_t neike1;
extern const lv_img_dsc_t WAIKE;
extern const lv_img_dsc_t chliren;
extern const lv_img_dsc_t body;
extern const lv_img_dsc_t breath;
extern const lv_img_dsc_t EYES;
extern const lv_img_dsc_t ebh;
extern const lv_img_dsc_t woman;
extern const lv_img_dsc_t PIFU;
extern const lv_img_dsc_t ZHONGYAO;
extern const lv_img_dsc_t YILIAO;
// 1. 定义全局/静态的消息框按钮数组（必须以NULL结尾，避免局部数组释放）
static const char * mbox_btns[] = {"确定", NULL};
// 字体声明
LV_FONT_DECLARE(lv_font_fan_24);  // 自定义字体
LV_FONT_DECLARE(lv_font_montserrat_34);  // 替换不存在的 lv_font_montserrat_48

// 科室数据（图片+名称，一一对应）
const lv_img_dsc_t * department_images[12] = {
    &neike1, &WAIKE,    &chliren,  &body,
    &breath, &EYES,     &ebh,      &woman,
    &PIFU  , &ZHONGYAO,  &YILIAO,   &NEIKE
};
const char * department_names[12] = {
    "内科", "外科", "儿科", "妇产科",
    "呼吸", "眼科", "耳鼻喉", "妇科",
    "皮肤科", "中医", "医疗", "消化内科"
};

// 全局组件（仅当前文件使用，用static修饰）
static lv_obj_t *grid;
static lv_obj_t *selected_item = NULL;
static int selected_department_index = -1;

// 函数原型声明（解决函数调用顺序问题）
void ui_Screen7_screen_deinit(void);
static void department_item_event_handler(lv_event_t *e);
static void back_btn_event_handler(lv_event_t *e);  // 返回按钮事件
static void confirm_btn_event_handler(lv_event_t *e);  // 确认按钮事件
static void create_department_item(lv_obj_t *parent, int index);
static void timer_callback(lv_timer_t *t);
static void msgbox_close_callback(lv_event_t *e);  // 消息框关闭回调

// 初始化科室选择界面 (Screen7)
void ui_Screen7_screen_init(void)
{
    // 若屏幕已存在，先销毁释放内存
    if (ui_Screen7 != NULL) {
        ui_Screen7_screen_deinit();
    }

    // 创建屏幕对象
    ui_Screen7 = lv_obj_create(NULL);
    if (!ui_Screen7) return;  // 创建失败直接返回，避免空指针访问

    // 屏幕基础样式
    lv_obj_clear_flag(ui_Screen7, LV_OBJ_FLAG_SCROLLABLE);  // 禁止滚动
    lv_obj_set_style_bg_img_src(ui_Screen7, &back1, LV_PART_MAIN | LV_STATE_DEFAULT);  // 背景图
    lv_obj_set_style_bg_color(ui_Screen7, lv_color_hex(0xFFFFFF), LV_PART_MAIN);  // 背景色（图片加载失败时显示）

    // 标题栏
    lv_obj_t *title_label = lv_label_create(ui_Screen7);
    lv_label_set_text(title_label, "选择挂号科室");
    lv_obj_set_style_text_font(title_label, &lv_font_fan_24, LV_PART_MAIN);
    lv_obj_set_style_text_color(title_label, lv_color_hex(0x1E88E5), LV_PART_MAIN);
    lv_obj_align(title_label, LV_ALIGN_TOP_MID, 0, 50);  // 顶部居中，向下偏移50px

    // 科室网格容器（3行4列布局）
    grid = lv_obj_create(ui_Screen7);
    lv_obj_set_size(grid, lv_pct(90), lv_pct(60));  // 占屏幕90%宽、60%高
    lv_obj_align(grid, LV_ALIGN_CENTER, 0, 0);  // 屏幕居中
    lv_obj_set_layout(grid, LV_LAYOUT_GRID);  // 网格布局
    lv_obj_set_style_bg_opa(grid, LV_OPA_0, LV_PART_MAIN);  // 容器背景透明

    // 网格布局参数（4列，每列占比1；3行，每行占比1）
    static lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
    static lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
    lv_obj_set_style_grid_column_dsc_array(grid, col_dsc, LV_PART_MAIN);
    lv_obj_set_style_grid_row_dsc_array(grid, row_dsc, LV_PART_MAIN);

    // 创建12个科室图标（循环生成）
    for (int i = 0; i < 12; i++) {
        create_department_item(grid, i);
    }

    // 底部按钮容器（存放返回、确认按钮）
    lv_obj_t *btn_cont = lv_obj_create(ui_Screen7);
    lv_obj_set_size(btn_cont, lv_pct(100), 60);  // 全屏宽，高60px
    lv_obj_align(btn_cont, LV_ALIGN_BOTTOM_MID, 0, 0);  // 底部居中
    lv_obj_set_layout(btn_cont, LV_LAYOUT_FLEX);  // 弹性布局
    lv_obj_set_flex_flow(btn_cont, LV_FLEX_FLOW_ROW);  // 水平排列
    lv_obj_set_flex_align(btn_cont, LV_FLEX_ALIGN_SPACE_AROUND, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 按钮左右分布
    lv_obj_set_style_bg_opa(btn_cont, LV_OPA_0, LV_PART_MAIN);  // 容器背景透明

    // ---------------------- 返回按钮 ----------------------
    lv_obj_t *back_btn = lv_btn_create(btn_cont);
    lv_obj_set_size(back_btn, 120, 45);  // 按钮大小
    lv_obj_set_style_radius(back_btn, 5, LV_PART_MAIN);  // 圆角5px
    lv_obj_set_style_bg_color(back_btn, lv_color_white(), LV_PART_MAIN);  // 白色背景
    lv_obj_set_style_border_color(back_btn, lv_color_hex(0xCCCCCC), LV_PART_MAIN);  // 灰色边框
    lv_obj_set_style_border_width(back_btn, 1, LV_PART_MAIN);  // 边框宽1px
    lv_obj_add_event_cb(back_btn, back_btn_event_handler, LV_EVENT_CLICKED, NULL);  // 绑定返回事件

    // 返回按钮标签
    lv_obj_t *back_btn_label = lv_label_create(back_btn);
    lv_label_set_text(back_btn_label, "返回");
    lv_obj_set_style_text_font(back_btn_label, &lv_font_fan_24, LV_PART_MAIN);
    lv_obj_set_style_text_color(back_btn_label, lv_color_hex(0x555555), LV_PART_MAIN);
    lv_obj_center(back_btn_label);  // 标签在按钮内居中

    // ---------------------- 确认按钮 ----------------------
    lv_obj_t *confirm_btn = lv_btn_create(btn_cont);
    lv_obj_set_size(confirm_btn, 120, 45);  // 按钮大小
    lv_obj_set_style_radius(confirm_btn, 5, LV_PART_MAIN);  // 圆角5px
    lv_obj_set_style_bg_color(confirm_btn, lv_color_hex(0x1E88E5), LV_PART_MAIN);  // 蓝色背景
    lv_obj_add_event_cb(confirm_btn, confirm_btn_event_handler, LV_EVENT_CLICKED, NULL);  // 绑定确认事件

    // 确认按钮标签
    lv_obj_t *confirm_btn_label = lv_label_create(confirm_btn);
    lv_label_set_text(confirm_btn_label, "确认");
    lv_obj_set_style_text_font(confirm_btn_label, &lv_font_fan_24, LV_PART_MAIN);
    lv_obj_set_style_text_color(confirm_btn_label, lv_color_white(), LV_PART_MAIN);
    lv_obj_center(confirm_btn_label);  // 标签在按钮内居中
}

// 创建单个科室图标项（图片+名称组合）
static void create_department_item(lv_obj_t *parent, int index)
{
    // 图标容器（包裹图片和名称，便于整体点击）
    lv_obj_t *item = lv_obj_create(parent);
    lv_obj_set_size(item, LV_SIZE_CONTENT, LV_SIZE_CONTENT);  // 大小自适应内容
    lv_obj_set_layout(item, LV_LAYOUT_FLEX);  // 弹性布局
    lv_obj_set_flex_flow(item, LV_FLEX_FLOW_COLUMN);  // 垂直排列（图片在上，名称在下）
    lv_obj_set_flex_align(item, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 内容居中
    lv_obj_set_style_bg_opa(item, LV_OPA_0, LV_PART_MAIN);  // 容器背景透明
    lv_obj_set_style_pad_all(item, 10, LV_PART_MAIN);  // 内边距10px（避免内容拥挤）

    // 设置容器在网格中的位置（第row行，第col列，占1行1列）
    int col = index % 4;  // 列索引（0-3，4列循环）
    int row = index / 4;  // 行索引（0-2，3行循环）
    lv_obj_set_grid_cell(item, LV_GRID_ALIGN_STRETCH, col, 1, LV_GRID_ALIGN_STRETCH, row, 1);

    // 科室图片
    lv_obj_t *img = lv_img_create(item);
    if (department_images[index] != NULL) {
        lv_img_set_src(img, department_images[index]);  // 加载自定义图片
    } else {
        // 图片加载失败时，显示默认图标
        lv_img_set_src(img, LV_SYMBOL_IMAGE);
        lv_obj_set_style_text_font(img, &lv_font_montserrat_34, LV_PART_MAIN);
    }
    lv_obj_set_size(img, 60, 60);  // 图片固定大小

    // 科室名称标签
    lv_obj_t *label = lv_label_create(item);
    lv_label_set_text(label, department_names[index]);  // 显示科室名称
    lv_obj_set_style_text_font(label, &lv_font_fan_24, LV_PART_MAIN);
    lv_obj_set_style_text_color(label, lv_color_hex(0x555555), LV_PART_MAIN);

    // 绑定科室项点击事件（用于选中效果）
    lv_obj_add_event_cb(item, department_item_event_handler, LV_EVENT_CLICKED, NULL);
}

// 科室项点击事件（实现单选选中效果）
static void department_item_event_handler(lv_event_t *e)
{
    lv_obj_t *clicked_item = lv_event_get_target(e);  // 获取被点击的科室项
    int index = lv_obj_get_index(clicked_item);  // 获取科室项索引（对应科室数据）

    // 点击已选中的项：取消选中
    if (clicked_item == selected_item) {
        lv_obj_set_style_border_width(clicked_item, 0, LV_PART_MAIN);  // 移除边框
        lv_obj_set_style_bg_color(clicked_item, lv_color_white(), LV_PART_MAIN);  // 背景恢复白色
        selected_item = NULL;  // 清空选中记录
        selected_department_index = -1;
        return;
    }

    // 清除上一个选中项的样式
    if (selected_item != NULL) {
        lv_obj_set_style_border_width(selected_item, 0, LV_PART_MAIN);
        lv_obj_set_style_bg_color(selected_item, lv_color_white(), LV_PART_MAIN);
    }

    // 设置当前项为选中状态
    selected_item = clicked_item;
    selected_department_index = index;
    lv_obj_set_style_border_color(clicked_item, lv_color_hex(0x1E88E5), LV_PART_MAIN);  // 蓝色边框
    lv_obj_set_style_border_width(clicked_item, 2, LV_PART_MAIN);  // 边框宽2px
    lv_obj_set_style_bg_color(clicked_item, lv_color_hex(0xF0F7FF), LV_PART_MAIN);  // 浅蓝色背景（选中高亮）
}

// 返回按钮事件
static void back_btn_event_handler(lv_event_t *e)
{
    LV_UNUSED(e);  

    // 跳转到目标界面（Screen8）
    if (ui_Screen8 == NULL) {
        ui_Screen8_screen_init();
    }
    lv_scr_load(ui_Screen4);  // 切换屏幕

    // 销毁当前Screen7，释放内存（避免内存泄漏）
    ui_Screen7_screen_deinit();
}

// 确认按钮事件（修复后）
static void confirm_btn_event_handler(lv_event_t *e)
{
    LV_UNUSED(e);

    // 未选择科室：显示提示消息框
    if (selected_department_index < 0) {
        // 用全局按钮数组，且不绑定额外回调（点击确定直接关闭）
        lv_obj_t *mbox = lv_msgbox_create(lv_scr_act(), "提示", "请先选择一个科室", mbox_btns, false);
        lv_obj_set_style_text_font(mbox, &lv_font_fan_24, LV_PART_MAIN);
        lv_obj_center(mbox);
        return;
    }

    // 已选择科室：显示选择成功消息框
    char msg[64];
    // 额外增加索引检查，避免数组越界（双重保险）
    if (selected_department_index >= 0 && selected_department_index < 12) {
        snprintf(msg, sizeof(msg), "您选择了【%s】", department_names[selected_department_index]);
    } else {
        snprintf(msg, sizeof(msg), "选择失败，请重试");
    }

    // 创建消息框，绑定自定义关闭回调
    lv_obj_t *mbox = lv_msgbox_create(lv_scr_act(), "选择成功", msg, mbox_btns, false);
    lv_obj_set_style_text_font(mbox, &lv_font_fan_24, LV_PART_MAIN);
    lv_obj_center(mbox);

    // 绑定消息框关闭回调（正确的回调类型，不强制转换）
    lv_obj_add_event_cb(mbox, msgbox_close_callback, LV_EVENT_VALUE_CHANGED, NULL);
}

    // 消息框关闭回调（正确的参数类型，匹配lv_event_cb_t）
    static void msgbox_close_callback(lv_event_t *e)
    {
        lv_obj_t *mbox = lv_event_get_target(e);
        // 1. 先关闭消息框
        lv_msgbox_close(mbox);
        // 2. 延迟500ms跳转（避免界面切换卡顿）
        lv_timer_create(timer_callback, 500, NULL);
    }
    // 定时器回调（实际执行界面跳转）
    static void timer_callback(lv_timer_t *t)
    {
        
        if (ui_Screen8 == NULL) {
            ui_Screen8_screen_init();
        }
        lv_scr_load(ui_Screen8);  

        // 删除定时器（避免重复触发）
        lv_timer_del(t);
    }


void ui_Screen7_screen_deinit(void)
{
    

    // 重置全局变量（避免下次初始化时残留旧数据）
    selected_item = NULL;
    selected_department_index = -1;
    grid = NULL;
}